import { type UserConfig, defineConfig, loadEnv, ConfigEnv } from 'vite';
import vue from '@vitejs/plugin-vue';
import path from 'path';
import UnoCSS from 'unocss/vite';
import { name, version, dependencies, devDependencies } from './package.json';

// 平台的名称、版本、运行所需的 node 版本、依赖、构建时间的类型提示
const APP_INFO = {
  pkg: { name, version, dependencies, devDependencies },
  buildTimestamp: Date.now()
};

// https://vite.dev/config/
export default defineConfig(({ mode }: ConfigEnv): UserConfig => {
  const { VITE_APP_PROXY_PREFIX, VITE_BASE_URL } = loadEnv(mode, process.cwd());
  return {
    plugins: [vue(), UnoCSS()],
    resolve: {
      alias: {
        '@': path.resolve(__dirname, './src') // 别名配置
      }
    },
    server: {
      host: '0.0.0.0',
      port: 8888,
      proxy: {
        [VITE_APP_PROXY_PREFIX]: {
          target: VITE_BASE_URL,
          changeOrigin: true,
          ws: true,
          toProxy: true,
          rewrite: path => {
            console.log('Rewriting path:', path);
            return path.replace(/^\/api/, '');
          }
        }
      }
    },
    css: {
      preprocessorOptions: {
        // 定义全局 SCSS 变量
        scss: {
          api: 'modern-compiler',
          additionalData: '@use "@/styles/variables.scss" as *;'
        }
      }
    },
    build: {
      // polyfillModulePreload: true, // 是否自动注入 module preload 的 polyfill
      outDir: 'dist', // 指定输出路径
      assetsDir: 'assets', // 指定生成静态文件目录
      cssCodeSplit: true, // 启用 CSS 代码拆分
      cssTarget: '', // 允许用户为 CSS 的压缩设置一个不同的浏览器 target 与 build.target 一致
      sourcemap: false, // 构建后是否生成 source map 文件
      manifest: false, // 当设置为 true，构建后将会生成 manifest.json 文件
      ssrManifest: false, // 构建不生成 SSR 的 manifest 文件
      ssr: undefined, // 生成面向 SSR 的构建
      write: true, // 启用将构建后的文件写入磁盘
      emptyOutDir: true, // 构建时清空该目录
      chunkSizeWarningLimit: 500, // chunk 大小警告的限制
      watch: null, // 设置为 {} 则会启用 rollup 的监听器
      // minify:false, // 表示打包后的文件内容不进行压缩，方便阅读
      terserOptions: {
        compress: {
          // 打包的时候可以移除console和debugger
          drop_console: true,
          drop_debugger: true
        }
      } // 传递给 minify: "terser" 的更多 minify 选项
    },
    define: {
      __APP_INFO__: JSON.stringify(APP_INFO)
    }
  };
});
